<?php
require('class.ezpdf.php');

class PDF extends Cezpdf
{
  function EAN13($x,$y,$barcode,$h=45.3543307087,$w=0.992125984252) 
  //$h=16 * 72/25.4; $w=.35 * 72/25.4;
  {
  	$this->Barcode($x,$y,$barcode,$h,$w,13);
  }
  
  function UPC_A($x,$y,$barcode,$h=45.3543307087,$w=0.992125984252)
  //$h=16 * 72/25.4; $w=.35 * 72/25.4;  
  {
  	$this->Barcode($x,$y,$barcode,$h,$w,12);
  }
  
  function GetCheckDigit($barcode)
  {
  	//Compute the check digit
  	$sum=0;
  	for($i=1;$i<=11;$i+=2)
  		$sum+=3*$barcode{$i};
  	for($i=0;$i<=10;$i+=2)
  		$sum+=$barcode{$i};
  	$r=$sum%10;
  	if($r>0)
  		$r=10-$r;
  	return $r;
  }
  
  function TestCheckDigit($barcode)
  {
  	//Test validity of check digit
  	$sum=0;
  	for($i=1;$i<=11;$i+=2)
  		$sum+=3*$barcode{$i};
  	for($i=0;$i<=10;$i+=2)
  		$sum+=$barcode{$i};
  	return ($sum+$barcode{12})%10==0;
  }
  
  function Barcode($x,$y,$barcode,$h,$w,$len)
  {
  	//Padding
  	$barcode=str_pad($barcode,$len-1,'0',STR_PAD_RIGHT);
  	if($len==12)
  		$barcode='0'.$barcode;
  	//Add or control the check digit
  	if(strlen($barcode)==12)
  		$barcode.=$this->GetCheckDigit($barcode);
  	elseif(!$this->TestCheckDigit($barcode))
  		die('Incorrect check digit');
  	//Convert digits to bars
  	$codes=array(
  		'A'=>array(
  			'0'=>'0001101','1'=>'0011001','2'=>'0010011','3'=>'0111101','4'=>'0100011',
  			'5'=>'0110001','6'=>'0101111','7'=>'0111011','8'=>'0110111','9'=>'0001011'),
  		'B'=>array(
  			'0'=>'0100111','1'=>'0110011','2'=>'0011011','3'=>'0100001','4'=>'0011101',
  			'5'=>'0111001','6'=>'0000101','7'=>'0010001','8'=>'0001001','9'=>'0010111'),
  		'C'=>array(
  			'0'=>'1110010','1'=>'1100110','2'=>'1101100','3'=>'1000010','4'=>'1011100',
  			'5'=>'1001110','6'=>'1010000','7'=>'1000100','8'=>'1001000','9'=>'1110100')
  		);
  	$parities=array(
  		'0'=>array('A','A','A','A','A','A'),
  		'1'=>array('A','A','B','A','B','B'),
  		'2'=>array('A','A','B','B','A','B'),
  		'3'=>array('A','A','B','B','B','A'),
  		'4'=>array('A','B','A','A','B','B'),
  		'5'=>array('A','B','B','A','A','B'),
  		'6'=>array('A','B','B','B','A','A'),
  		'7'=>array('A','B','A','B','A','B'),
  		'8'=>array('A','B','A','B','B','A'),
  		'9'=>array('A','B','B','A','B','A')
  		);
  	$code='101';
  	$p=$parities[$barcode{0}];
  	for($i=1;$i<=6;$i++)
  		$code.=$codes[$p[$i-1]][$barcode{$i}];
  	$code.='01010';
  	for($i=7;$i<=12;$i++)
  		$code.=$codes['C'][$barcode{$i}];
  	$code.='101';
	
  	//Draw bars
  	for($i=0;$i<strlen($code);$i++)
  	{
  		if($code{$i}=='1')
  			$this->filledRectangle($x+$i*$w,$y,$w,$h);
  	}
  	$last_x = $x+$i*$w;
  	//Print text uder barcode
  	$this->selectFont('./fonts/Courier');
  	$font_size = 12;
  	$start_text = $x + (($last_x - $x) - $font_size*.6*$len) /2;  	
    $this->addText($start_text,$y-11,$font_size,substr($barcode,-$len)); 
  }
}

?>
